// Record和object,Map区别
// 定义Goods接口
const goodSymid = Symbol('goodid')
interface Goods {
  [goodSymid]: number
  name: string
  price: number
}
type Record<T> = {
  // S100
  [P in keyof any]: T
}
// -------------------------------区别----------------------
// Record和object区别
// 区别1：Record 获取到是索引参数类型，所以可以赋初值为{}
// 而object也可以，但是再次赋值，比如： goodRecord[103] = good2;
//   会出现错误，会查找103属性是否存在于object类型的对象变量中

// 区别2： Record是泛型，获取值可以有自动提示功能，而object无法实现自动提示。

type resultGoodsType = Record<Goods>
/**
 * let goodRecord = {} 这不添加 object 它会自动推导类型，加了object 就是 object 类型，不会去推导了
 */
let good: Goods = { [goodSymid]: 101, name: '苹果', price: 9 }

// --------------- let obj = {} 的情况 ---------------
/**
 * 这里会报错，因为 goodRecord 不存在 103  ，在ts是不允许的，在js允许这样操作
 * 但是问题来了？？ 为什么在Record中就可以？
 * 例如 Record 中的 [x: string] 是可以索引的string 类型，是允许为空的，什么不写的属性
 */
//  let goodRecord = {}
// let good2: Goods = { [goodSymid]: 101, "name": "苹果", "price": 9 }
// goodRecord[103] = good2
// goodRecord['香蕉'] = good
// goodRecord[good[goodSymid]] = good
// console.log('goodRecord:', goodRecord)
// Record类型对于取出来的对象，可以自动提示输出对象的属性和方法

// --------------- let obj: object = {} 的情况 ---------------
/**
 * 添加上 object 之后， goodRecord[103] 也报错了
 * 当不添加的时候，会去推导 name: string; 103: Goods; 有 103可以去修改
 * 当添加的时候 就不会去推导了，变量类型就是object了，在编译期间，103 会去 object 里面去要，但是这个object 里面没有103这个属性
 * // 编译器尝试从object上查找103属性,
// 但object什么属性和方法都没有，只是单纯表示一个对象的类型
// Object也不行，因为也没有103属性,直接抛出  类型“Object”上不存在属性“103”。ts(7053)
 */
let goodRecord = { name: 'awneguw', 103: good }
let good2: Goods = { [goodSymid]: 101, name: '苹果', price: 9 }
goodRecord[103] = good2
goodRecord['香蕉'] = good
goodRecord[good[goodSymid]] = good
console.log('goodRecord:', goodRecord)
for (let goodid in goodRecord) {
  let good = goodRecord[goodid]
  console.log(goodid, ':', good)
}

export {}

// 编译器尝试从object上查找103属性,但object什么属性和方法都没有，只是单纯表示一个对象的类型
// Object也不行，因为也没有103属性
